// 进行axios的全局配置（拦截器配置）
import axios from 'axios'
// 导入ElementUI 提示组件
import {
  Message
} from 'element-ui'
import store from '../store'
import ErrorCodeMsg from './errorCode'
import ErrorCodeMsg400 from './errorCode400'
import router from '../router'
// 项目接口根地址
const BASE_API = '/admin'

// 默认配置参数
const defaultOptions = {
  baseURL: BASE_API
}

// 创建axios实例
const instance = axios.create(defaultOptions)

// 配置请求拦截器 - 负责请求发起之前的业务
instance.interceptors.request.use(config => {
  if (store.state.user.info['access_token']) { // 有token就携带包头
    // 统一携带token令牌
    // 以防token失效，所以请求时将本地保存的token带上，也有可能token已经过期
    config.headers['Authorization'] = store.state.user.info['access_token']
  }
  return config
}, error => {
  console.log(error)
})

// 配置响应拦截器 - 负责处理请求结束 具体业务实现之前的业务逻辑
instance.interceptors.response.use(res => {
  // console.log(res)
  return res
}, err => {
  // console.log(this)
  // 统一处理响应失败业务
  let errorTip = '网络请求失败'
  // 针对token失效，过期（发请求重新更新token），异常的情况，需要直接退出并清空当前用户的信息
  let specialCode = ['100065', '100043', '100044', '10002'] // 特殊错误码
  switch (err.response.status) {
    case 401: // 身份校验失败
      var errorCode = err.response.data.errorCode
      errorTip = ErrorCodeMsg[errorCode]
      // 处理特殊错误码
      if (specialCode.includes(errorCode)) {
        let redirectUrl = router.currentRoute.fullpath || '/' // 获取当前的路由地址
        // 1.清空当前用户的数据
        store.dispatch('user/clearUserInfo').then(() => {
          // 2.跳转登录页
          router.push({
            path: '/login',
            redirect: redirectUrl
          })
        })
      }
      break
    case 400:
      errorCode = err.response.data.errorCode // 获取响应的错误码
      errorTip = ErrorCodeMsg400[errorCode] || errorTip
      break
    case 403:
      break // 权限校验失败
  }
  Message({
    type: 'error',
    message: errorTip
  })
  // return err
})

export default instance
